#ifndef __IF_INSTRUCTIONFILTER_H__
#define __IF_INSTRUCTIONFILTER_H__

#include <stdint.h>




/***************************************************************************************************
* 宏定义
*
****************************************************************************************************/
extern uint32_t sys_now(void);
#define IF_BUFF_SIZE    50  //设定用于指令过滤器的缓冲区大小
#define IF_TIMEROUT    100  //指令过滤器工作超时时间
#define IF_GET_SYS_TIMER    sys_now()  //指令过滤器工作超时时间

#define IF_FLAG_HAVE_PARAM  0x01    //函数带参数  否则 不带参数
#define IF_FLAG_WRITE_DATA  0x02    //等待超时回写指令 
#define IF_FLAG_CMD_CALL    0x04    //收到指令立即调用



//响应函数返回值{
#define NO_DEAL_WITH 0      //当前响应函数没有拦截数据，本此数据由指令过滤器继续处理，【未处理】
#define DEAL_WITH 1         //当前响应函数还在处理数据，本次数据已被响应函数拦截使用，【正在处理】
#define DEAL_WITH_END 2     //当前响应函数还在处理数据，本次数据已被响应函数拦截使用，【处理结束】
//}响应函数返回值

//响应函数调用处{
#define POSITION_CMD_CALL 0      // 指令匹配的时候调用
#define POSITION_REC_CALL 1      // 收到数据的时候调用
//}响应函数调用处

/***************************************************************************************************
* 外部函数声明
*
****************************************************************************************************/


/***************************************************************************************************
* 数据类型定义
*
****************************************************************************************************/
typedef uint8_t (*ResponseFun)(uint8_t DateValue,uint8_t position);//响应函数指针，DateValue为传入的处理数据
typedef uint8_t (*OtherFun)(uint8_t date);//响应函数指针，DateValue为传入的处理数据
#if defined ( __CC_ARM   )
#pragma anon_unions
#endif
typedef struct
{
    const uint8_t *P;     //指向指令的指针 4字节
    uint16_t Len;    //指令的长度
    union
    {
    uint16_t Flag; //设置标志位
        struct
        {
            uint16_t HaveParam      :1;//函数是否带参数
            uint16_t WRITE_BACK    :1;//等待数据超时，则把指令回吐
            uint16_t CmdCallFun     :1;//收到指令立即调用
        };
    };

    uint32_t Timerout;//该指令等待处理数据的超时时间，0无限等待
    ResponseFun Fun;    //指令的处理函数地址
}IF_CmdData;
typedef struct
{
    uint16_t START;  //指令匹配的起点
    uint16_t MACTH;  //指令当前已匹配的程度
}CmdDataIndex;
typedef struct
{
    uint8_t READ;   //过滤数据输出位置
    uint8_t START;  //过滤窗口的起点，所有指令中最小的匹配起点
    uint8_t WRITE;  //数据输入位置,数据写入的时候更新
    uint8_t CmdLen; //指令集合的长度
    uint32_t Timer;    //记录工作时间
    const IF_CmdData *CMD;   //指令集合
    CmdDataIndex *CMDIndex;//存储每条指令的匹配进度
    OtherFun MaxFun;//数据溢出处理函数,即WRITE追上READ的时候
    OtherFun TimoutFun;
    uint16_t Fun;    //当前要响应的指令索引，没有响应指令则与CmdLen 一样大
    uint16_t DataWindowNum;//DataWindow工作的窗口中存储数据的个数
    uint8_t DataWindow[IF_BUFF_SIZE];   //用于工作的窗口，包含过滤数据和过滤空间

}CmdWindow;



/***************************************************************************************************
* 变量声明
*
****************************************************************************************************/

/***************************************************************************************************
* 接口函数声明
*
****************************************************************************************************/

/* 指令过滤处理函数 */
uint8_t IF_InstructionFilter(CmdWindow *WindowIden,uint8_t Data);
/* 是否有过滤出来的数据 */
uint8_t IF_GetDataSize(CmdWindow *WindowIden);
/* 读取一个过滤出来的数据 */
uint8_t IF_GetData(CmdWindow *WindowIden);
/* 回写数据 */
void IF_WriteData(CmdWindow *WindowIden, uint8_t Data);
/*获取上次获取数据的时间*/
uint32_t IF_GetTimer(CmdWindow *WindowIden);
/*获取当前响应函数的索引号*/
uint16_t IF_GetFunIndex(CmdWindow *WindowIden);
/*c超时处理函数*/
void IF_TimeoutHandler(CmdWindow *WindowIden);

#endif
